﻿using System;
using System.Threading;

namespace ELW.Library.Math.Calculators.Standard
{
    internal sealed class Calculator_rndN : IOperationCalculator
    {
        #region IOperationCalculator Members

        public double Calculate(params double[] parameters)
        {
            if (parameters == null)
                throw new ArgumentNullException("parameters");
            if (parameters.Length != 2)
                throw new ArgumentException("Это функция с двумя параметрами. Количество параметров должно быть равным 2", "parameters");
            //
            double eps, x, y, s, z0 = 0;
            // Задание случайных величин
            do
            {
                x = RandomStatic.NextDouble() * 2 - 1;
                y = RandomStatic.NextDouble() * 2 - 1;
                s = System.Math.Pow(x, 2) + System.Math.Pow(y, 2);
            }
            while (s > 1 || s == 0);
            z0 = x * System.Math.Sqrt((-2 * System.Math.Log(s)) / s);
            eps = parameters[0] + parameters[1] * z0;
            return eps;
        }

        #endregion
    }
}
